; ModuleID = 'expr'
source_filename = "expr"

@0 = private unnamed_addr constant [16 x i8] c"expr value: %d\0A\00", align 1

declare i32 @printf(ptr, ...)

define i32 @main() {
entry:
  %a = alloca i32, align 4
  store i32 3, ptr %a, align 4
  %a1 = load i32, ptr %a, align 4
  %b = alloca i32, align 4
  store i32 5, ptr %b, align 4
  %b2 = load i32, ptr %b, align 4
  br label %if_cond

if_cond:                                          ; preds = %entry
  %a3 = load i32, ptr %a, align 4
  %0 = icmp ne i32 %a3, 0
  br i1 %0, label %logor_true, label %logor_next

if_then:                                          ; preds = %logor_merge
  %a6 = load i32, ptr %a, align 4
  %b7 = load i32, ptr %b, align 4
  %sub = sub nsw i32 %a6, %b7
  store i32 %sub, ptr %a, align 4
  %a8 = load i32, ptr %a, align 4
  br label %if_last

if_last:                                          ; preds = %if_then, %logor_merge
  br label %if_cond9

logor_next:                                       ; preds = %if_cond
  %b4 = load i32, ptr %b, align 4
  %1 = icmp ne i32 %b4, 0
  br i1 %1, label %logand_next, label %logand_false

logand_next:                                      ; preds = %logor_next
  %a5 = load i32, ptr %a, align 4
  %2 = icmp ne i32 %a5, 0
  %3 = zext i1 %2 to i32
  br label %logand_merge

logand_false:                                     ; preds = %logor_next
  br label %logand_merge

logand_merge:                                     ; preds = %logand_false, %logand_next
  %4 = phi i32 [ %3, %logand_next ], [ 0, %logand_false ]
  %5 = icmp ne i32 %4, 0
  %6 = zext i1 %5 to i32
  br label %logor_merge

logor_true:                                       ; preds = %if_cond
  br label %logor_merge

logor_merge:                                      ; preds = %logor_true, %logand_merge
  %7 = phi i32 [ %6, %logand_merge ], [ 0, %logor_true ]
  %8 = icmp ne i32 %7, 0
  br i1 %8, label %if_then, label %if_last

if_cond9:                                         ; preds = %if_last
  %a14 = load i32, ptr %a, align 4
  %9 = icmp ne i32 %a14, 0
  br i1 %9, label %logand_next13, label %logand_false16

if_then10:                                        ; preds = %logor_merge20
  %a21 = load i32, ptr %a, align 4
  %b22 = load i32, ptr %b, align 4
  %add = add nsw i32 %a21, %b22
  store i32 %add, ptr %b, align 4
  %b23 = load i32, ptr %b, align 4
  br label %if_last11

if_last11:                                        ; preds = %if_then10, %logor_merge20
  %a24 = load i32, ptr %a, align 4
  %b25 = load i32, ptr %b, align 4
  %bit_and = and i32 %a24, %b25
  store i32 %bit_and, ptr %a, align 4
  %a26 = load i32, ptr %a, align 4
  %a27 = load i32, ptr %a, align 4
  %b28 = load i32, ptr %b, align 4
  %bit_or = or i32 %a27, %b28
  store i32 %bit_or, ptr %a, align 4
  %a29 = load i32, ptr %a, align 4
  %a30 = load i32, ptr %a, align 4
  %b31 = load i32, ptr %b, align 4
  %bit_xor = xor i32 %a30, %b31
  store i32 %bit_xor, ptr %b, align 4
  %b32 = load i32, ptr %b, align 4
  %a33 = load i32, ptr %a, align 4
  %b34 = load i32, ptr %b, align 4
  %left_shift = shl i32 %a33, %b34
  store i32 %left_shift, ptr %b, align 4
  %b35 = load i32, ptr %b, align 4
  %a36 = load i32, ptr %a, align 4
  %b37 = load i32, ptr %b, align 4
  %right_shift = ashr i32 %a36, %b37
  store i32 %right_shift, ptr %a, align 4
  %a38 = load i32, ptr %a, align 4
  %a39 = load i32, ptr %a, align 4
  %b40 = load i32, ptr %b, align 4
  %mul = mul nsw i32 %a39, %b40
  %sub41 = sub nsw i32 %mul, 4
  %a42 = load i32, ptr %a, align 4
  %add43 = add nsw i32 %sub41, %a42
  %10 = call i32 (ptr, ...) @printf(ptr @0, i32 %add43)
  ret i32 0

logor_next12:                                     ; preds = %logand_merge17
  %b18 = load i32, ptr %b, align 4
  %11 = icmp ne i32 %b18, 0
  %12 = zext i1 %11 to i32
  br label %logor_merge20

logand_next13:                                    ; preds = %if_cond9
  %b15 = load i32, ptr %b, align 4
  %13 = icmp ne i32 %b15, 0
  %14 = zext i1 %13 to i32
  br label %logand_merge17

logand_false16:                                   ; preds = %if_cond9
  br label %logand_merge17

logand_merge17:                                   ; preds = %logand_false16, %logand_next13
  %15 = phi i32 [ %14, %logand_next13 ], [ 0, %logand_false16 ]
  %16 = icmp ne i32 %15, 0
  br i1 %16, label %logor_true19, label %logor_next12

logor_true19:                                     ; preds = %logand_merge17
  br label %logor_merge20

logor_merge20:                                    ; preds = %logor_true19, %logor_next12
  %17 = phi i32 [ %12, %logor_next12 ], [ 0, %logor_true19 ]
  %18 = icmp ne i32 %17, 0
  br i1 %18, label %if_then10, label %if_last11
}
